Explaining Text Classification

from explainer.explainers import feature_attributions_explainer, metrics_explainer
feature_attributions_explainer.entry_points
True
import numpy as np
from sklearn import datasets

all_categories = ['alt.atheism','comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware',
                  'comp.sys.mac.hardware','comp.windows.x', 'misc.forsale','rec.autos','rec.motorcycles',
                  'rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med',
                  'sci.space','soc.religion.christian','talk.politics.guns','talk.politics.mideast',
                  'talk.politics.misc','talk.religion.misc']

selected_categories = ['alt.atheism','comp.graphics','rec.motorcycles','sci.space','talk.politics.misc']

X_train_text, Y_train = datasets.fetch_20newsgroups(subset="train", categories=selected_categories, return_X_y=True)
X_test_text , Y_test  = datasets.fetch_20newsgroups(subset="test", categories=selected_categories, return_X_y=True)

X_train_text = np.array(X_train_text)
X_test_text = np.array(X_test_text)

classes = np.unique(Y_train)
mapping = dict(zip(classes, selected_categories))

len(X_train_text), len(X_test_text), classes, mapping
(2720,
 1810,
 array([0, 1, 2, 3, 4]),
 {0: 'alt.atheism',
  1: 'comp.graphics',
  2: 'rec.motorcycles',
  3: 'sci.space',
  4: 'talk.politics.misc'})
print(Y_test)
[2 3 0 ... 3 2 3]

Vectorize Text Data

import sklearn
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=50000)

vectorizer.fit(np.concatenate((X_train_text, X_test_text)))
X_train = vectorizer.transform(X_train_text)
X_test = vectorizer.transform(X_test_text)

X_train, X_test = X_train.toarray(), X_test.toarray()

X_train.shape, X_test.shape
((2720, 50000), (1810, 50000))

Define the Model

from tensorflow.keras.models import Sequential
from tensorflow.keras import layers

def create_model():
    return Sequential([
                        layers.Input(shape=X_train.shape[1:]),
                        layers.Dense(128, activation="relu"),
                        layers.Dense(64, activation="relu"),
                        layers.Dense(len(classes), activation="softmax"),
                    ])

model = create_model()

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 128)               6400128   
                                                                 
 dense_1 (Dense)             (None, 64)                8256      
                                                                 
 dense_2 (Dense)             (None, 5)                 325       
                                                                 
=================================================================
Total params: 6,408,709
Trainable params: 6,408,709
Non-trainable params: 0
_________________________________________________________________
2022-10-18 22:31:07.509365: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F AVX512_VNNI AVX512_BF16 AVX_VNNI AMX_TILE AMX_INT8 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.

User settings:

   KMP_AFFINITY=granularity=fine,verbose,compact,1,0
   KMP_BLOCKTIME=1
   KMP_DUPLICATE_LIB_OK=True
   KMP_INIT_AT_FORK=FALSE
   KMP_SETTINGS=1
   KMP_WARNINGS=0

Effective settings:

   KMP_ABORT_DELAY=0
   KMP_ADAPTIVE_LOCK_PROPS='1,1024'
   KMP_ALIGN_ALLOC=64
   KMP_ALL_THREADPRIVATE=768
   KMP_ATOMIC_MODE=2
   KMP_BLOCKTIME=1
   KMP_CPUINFO_FILE: value is not defined
   KMP_DETERMINISTIC_REDUCTION=false
   KMP_DEVICE_THREAD_LIMIT=2147483647
   KMP_DISP_NUM_BUFFERS=7
   KMP_DUPLICATE_LIB_OK=true
   KMP_ENABLE_TASK_THROTTLING=true
   KMP_FORCE_REDUCTION: value is not defined
   KMP_FOREIGN_THREADS_THREADPRIVATE=true
   KMP_FORKJOIN_BARRIER='2,2'
   KMP_FORKJOIN_BARRIER_PATTERN='hyper,hyper'
   KMP_GTID_MODE=3
   KMP_HANDLE_SIGNALS=false
   KMP_HOT_TEAMS_MAX_LEVEL=1
   KMP_HOT_TEAMS_MODE=0
   KMP_INIT_AT_FORK=true
   KMP_LIBRARY=throughput
   KMP_LOCK_KIND=queuing
   KMP_MALLOC_POOL_INCR=1M
   KMP_NUM_LOCKS_IN_BLOCK=1
   KMP_PLAIN_BARRIER='2,2'
   KMP_PLAIN_BARRIER_PATTERN='hyper,hyper'
   KMP_REDUCTION_BARRIER='1,1'
   KMP_REDUCTION_BARRIER_PATTERN='hyper,hyper'
   KMP_SCHEDULE='static,balanced;guided,iterative'
   KMP_SETTINGS=true
   KMP_SPIN_BACKOFF_PARAMS='4096,100'
   KMP_STACKOFFSET=64
   KMP_STACKPAD=0
   KMP_STACKSIZE=8M
   KMP_STORAGE_MAP=false
   KMP_TASKING=2
   KMP_TASKLOOP_MIN_TASKS=0
   KMP_TASK_STEALING_CONSTRAINT=1
   KMP_TEAMS_THREAD_LIMIT=192
   KMP_TOPOLOGY_METHOD=all
   KMP_USE_YIELD=1
   KMP_VERSION=false
   KMP_WARNINGS=false
   OMP_AFFINITY_FORMAT='OMP: pid %P tid %i thread %n bound to OS proc set {%A}'
   OMP_ALLOCATOR=omp_default_mem_alloc
   OMP_CANCELLATION=false
   OMP_DEFAULT_DEVICE=0
   OMP_DISPLAY_AFFINITY=false
   OMP_DISPLAY_ENV=false
   OMP_DYNAMIC=false
   OMP_MAX_ACTIVE_LEVELS=1
   OMP_MAX_TASK_PRIORITY=0
   OMP_NESTED: deprecated; max-active-levels-var=1
   OMP_NUM_THREADS: value is not defined
   OMP_PLACES: value is not defined
   OMP_PROC_BIND='intel'
   OMP_SCHEDULE='static'
   OMP_STACKSIZE=8M
   OMP_TARGET_OFFLOAD=DEFAULT
   OMP_THREAD_LIMIT=2147483647
   OMP_WAIT_POLICY=PASSIVE
   KMP_AFFINITY='verbose,warnings,respect,granularity=fine,compact,1,0'

2022-10-18 22:31:07.551658: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 

Compile and Train Model

model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
history = model.fit(X_train, Y_train, batch_size=256, epochs=5, validation_data=(X_test, Y_test))
Epoch 1/5
 1/11 [=>............................] - ETA: 15s - loss: 1.6095 - accuracy: 0.1797

 2/11 [====>.........................] - ETA: 1s - loss: 1.6073 - accuracy: 0.3555 

 3/11 [=======>......................] - ETA: 1s - loss: 1.6047 - accuracy: 0.4375

 4/11 [=========>....................] - ETA: 1s - loss: 1.6007 - accuracy: 0.5010

 5/11 [============>.................] - ETA: 1s - loss: 1.5953 - accuracy: 0.5617

 6/11 [===============>..............] - ETA: 0s - loss: 1.5891 - accuracy: 0.6152

 7/11 [==================>...........] - ETA: 0s - loss: 1.5818 - accuracy: 0.6562

 8/11 [====================>.........] - ETA: 0s - loss: 1.5728 - accuracy: 0.6929

 9/11 [=======================>......] - ETA: 0s - loss: 1.5634 - accuracy: 0.7227

10/11 [==========================>...] - ETA: 0s - loss: 1.5535 - accuracy: 0.7445

11/11 [==============================] - ETA: 0s - loss: 1.5471 - accuracy: 0.7563

11/11 [==============================] - 4s 235ms/step - loss: 1.5471 - accuracy: 0.7563 - val_loss: 1.4402 - val_accuracy: 0.9017
Epoch 2/5
 1/11 [=>............................] - ETA: 0s - loss: 1.3803 - accuracy: 0.9961

 2/11 [====>.........................] - ETA: 0s - loss: 1.3647 - accuracy: 0.9922

 3/11 [=======>......................] - ETA: 0s - loss: 1.3458 - accuracy: 0.9922

 4/11 [=========>....................] - ETA: 0s - loss: 1.3317 - accuracy: 0.9902

 5/11 [============>.................] - ETA: 0s - loss: 1.3145 - accuracy: 0.9898

 6/11 [===============>..............] - ETA: 0s - loss: 1.2957 - accuracy: 0.9902

 7/11 [==================>...........] - ETA: 0s - loss: 1.2774 - accuracy: 0.9888

 8/11 [====================>.........] - ETA: 0s - loss: 1.2573 - accuracy: 0.9888

 9/11 [=======================>......] - ETA: 0s - loss: 1.2380 - accuracy: 0.9896

10/11 [==========================>...] - ETA: 0s - loss: 1.2176 - accuracy: 0.9898

11/11 [==============================] - ETA: 0s - loss: 1.2046 - accuracy: 0.9897

11/11 [==============================] - 1s 113ms/step - loss: 1.2046 - accuracy: 0.9897 - val_loss: 1.1129 - val_accuracy: 0.9171
Epoch 3/5
 1/11 [=>............................] - ETA: 0s - loss: 0.9237 - accuracy: 1.0000

 2/11 [====>.........................] - ETA: 0s - loss: 0.8995 - accuracy: 0.9980

 3/11 [=======>......................] - ETA: 0s - loss: 0.8781 - accuracy: 0.9974

 4/11 [=========>....................] - ETA: 0s - loss: 0.8600 - accuracy: 0.9971

 5/11 [============>.................] - ETA: 0s - loss: 0.8311 - accuracy: 0.9969

 6/11 [===============>..............] - ETA: 0s - loss: 0.8102 - accuracy: 0.9967

 7/11 [==================>...........] - ETA: 0s - loss: 0.7885 - accuracy: 0.9972

 8/11 [====================>.........] - ETA: 0s - loss: 0.7681 - accuracy: 0.9971

 9/11 [=======================>......] - ETA: 0s - loss: 0.7493 - accuracy: 0.9974

10/11 [==========================>...] - ETA: 0s - loss: 0.7282 - accuracy: 0.9965

11/11 [==============================] - ETA: 0s - loss: 0.7159 - accuracy: 0.9967

11/11 [==============================] - 1s 107ms/step - loss: 0.7159 - accuracy: 0.9967 - val_loss: 0.7338 - val_accuracy: 0.9304
Epoch 4/5
 1/11 [=>............................] - ETA: 0s - loss: 0.4593 - accuracy: 0.9922

 2/11 [====>.........................] - ETA: 0s - loss: 0.4337 - accuracy: 0.9961

 3/11 [=======>......................] - ETA: 0s - loss: 0.4181 - accuracy: 0.9961

 4/11 [=========>....................] - ETA: 0s - loss: 0.3996 - accuracy: 0.9971

 5/11 [============>.................] - ETA: 0s - loss: 0.3831 - accuracy: 0.9961

 6/11 [===============>..............] - ETA: 0s - loss: 0.3681 - accuracy: 0.9967

 7/11 [==================>...........] - ETA: 0s - loss: 0.3546 - accuracy: 0.9972

 8/11 [====================>.........] - ETA: 0s - loss: 0.3396 - accuracy: 0.9976

 9/11 [=======================>......] - ETA: 0s - loss: 0.3277 - accuracy: 0.9978

10/11 [==========================>...] - ETA: 0s - loss: 0.3176 - accuracy: 0.9980

11/11 [==============================] - ETA: 0s - loss: 0.3097 - accuracy: 0.9982

11/11 [==============================] - 1s 117ms/step - loss: 0.3097 - accuracy: 0.9982 - val_loss: 0.4625 - val_accuracy: 0.9376
Epoch 5/5
 1/11 [=>............................] - ETA: 0s - loss: 0.1761 - accuracy: 0.9961

 2/11 [====>.........................] - ETA: 0s - loss: 0.1611 - accuracy: 0.9980

 3/11 [=======>......................] - ETA: 0s - loss: 0.1555 - accuracy: 0.9987

 5/11 [============>.................] - ETA: 0s - loss: 0.1419 - accuracy: 0.9992

 6/11 [===============>..............] - ETA: 0s - loss: 0.1378 - accuracy: 0.9993

 7/11 [==================>...........] - ETA: 0s - loss: 0.1318 - accuracy: 0.9994

 8/11 [====================>.........] - ETA: 0s - loss: 0.1268 - accuracy: 0.9990

 9/11 [=======================>......] - ETA: 0s - loss: 0.1223 - accuracy: 0.9991

10/11 [==========================>...] - ETA: 0s - loss: 0.1179 - accuracy: 0.9992

11/11 [==============================] - ETA: 0s - loss: 0.1156 - accuracy: 0.9993

11/11 [==============================] - 1s 114ms/step - loss: 0.1156 - accuracy: 0.9993 - val_loss: 0.3281 - val_accuracy: 0.9436

Evaluate Model Performance

from sklearn.metrics import accuracy_score, classification_report

train_preds = model.predict(X_train)
test_preds = model.predict(X_test)

print("Train Accuracy : {:.3f}".format(accuracy_score(Y_train, np.argmax(train_preds, axis=1))))
print("Test  Accuracy : {:.3f}".format(accuracy_score(Y_test, np.argmax(test_preds, axis=1))))
print("\nClassification Report : ")
print(classification_report(Y_test, np.argmax(test_preds, axis=1), target_names=selected_categories))
 1/85 [..............................] - ETA: 16s

 6/85 [=>............................] - ETA: 0s 

11/85 [==>...........................] - ETA: 0s

15/85 [====>.........................] - ETA: 0s

19/85 [=====>........................] - ETA: 0s

23/85 [=======>......................] - ETA: 0s

26/85 [========>.....................] - ETA: 0s

29/85 [=========>....................] - ETA: 0s

32/85 [==========>...................] - ETA: 0s

35/85 [===========>..................] - ETA: 0s

38/85 [============>.................] - ETA: 0s

40/85 [=============>................] - ETA: 0s

44/85 [==============>...............] - ETA: 0s

48/85 [===============>..............] - ETA: 0s

53/85 [=================>............] - ETA: 0s

59/85 [===================>..........] - ETA: 0s

66/85 [======================>.......] - ETA: 0s

73/85 [========================>.....] - ETA: 0s

80/85 [===========================>..] - ETA: 0s

85/85 [==============================] - 1s 12ms/step
 1/57 [..............................] - ETA: 23s

 6/57 [==>...........................] - ETA: 0s 

10/57 [====>.........................] - ETA: 0s

14/57 [======>.......................] - ETA: 0s

19/57 [=========>....................] - ETA: 0s

23/57 [===========>..................] - ETA: 0s

26/57 [============>.................] - ETA: 0s

29/57 [==============>...............] - ETA: 0s

32/57 [===============>..............] - ETA: 0s

35/57 [=================>............] - ETA: 0s

38/57 [===================>..........] - ETA: 0s

41/57 [====================>.........] - ETA: 0s

45/57 [======================>.......] - ETA: 0s

50/57 [=========================>....] - ETA: 0s

56/57 [============================>.] - ETA: 0s

57/57 [==============================] - 1s 14ms/step
Train Accuracy : 1.000
Test  Accuracy : 0.944

Classification Report : 
                    precision    recall  f1-score   support

       alt.atheism       0.97      0.93      0.95       319
     comp.graphics       0.92      0.97      0.94       389
   rec.motorcycles       0.98      0.98      0.98       398
         sci.space       0.90      0.94      0.92       394
talk.politics.misc       0.96      0.89      0.92       310

          accuracy                           0.94      1810
         macro avg       0.95      0.94      0.94      1810
      weighted avg       0.94      0.94      0.94      1810
# one-hot-encode clasess
oh_Y_test = np.eye(len(classes))[Y_test]

cm = metrics_explainer['confusionmatrix'](oh_Y_test, test_preds, selected_categories)
cm.visualize()
print(cm.report)
                    precision    recall  f1-score   support

       alt.atheism       0.97      0.93      0.95       319
     comp.graphics       0.92      0.97      0.94       389
   rec.motorcycles       0.98      0.98      0.98       398
         sci.space       0.90      0.94      0.92       394
talk.politics.misc       0.96      0.89      0.92       310

          accuracy                           0.94      1810
         macro avg       0.95      0.94      0.94      1810
      weighted avg       0.94      0.94      0.94      1810
../../_images/48b26b9b6d5e821572019ba4c632ee0082c0530bedaa49fbb969ddadf6a399b0.png
plotter = metrics_explainer['plot'](oh_Y_test, test_preds, selected_categories)
plotter.pr_curve()
plotter.roc_curve()

SHAP Partition Explainer

import shap
def make_predictions(X_batch_text):
    X_batch = vectorizer.transform(X_batch_text).toarray()
    preds = model.predict(X_batch)
    return preds

masker = shap.maskers.Text(tokenizer=r"\W+")
explainer = shap.Explainer(make_predictions, masker=masker, output_names=selected_categories)

explainer
<shap.explainers._partition.Partition at 0x7fd5f83d9250>

Visualize SHAP Values Correct Predictions

import re

X_batch_text = X_test_text[1:3]
X_batch = X_test[1:3]

print("Samples : ")
for text in X_batch_text:
    print(re.split(r"\W+", text))
    print()

preds_proba = model.predict(X_batch)
preds = preds_proba.argmax(axis=1)

# print("Actual    Target Values : {}".format([selected_categories[target] for target in Y_test[1:3]]))
# print("Predicted Target Values : {}".format([selected_categories[target] for target in preds]))
# print("Predicted Probabilities : {}".format(preds_proba.max(axis=1)))

shap_values = explainer(X_batch_text)
Samples : 
['From', 'prb', 'access', 'digex', 'net', 'Pat', 'Subject', 'Re', 'Near', 'Miss', 'Asteroids', 'Q', 'Organization', 'Express', 'Access', 'Online', 'Communications', 'Greenbelt', 'MD', 'USA', 'Lines', '4', 'Distribution', 'sci', 'NNTP', 'Posting', 'Host', 'access', 'digex', 'net', 'TRry', 'the', 'SKywatch', 'project', 'in', 'Arizona', 'pat', '']

['From', 'cobb', 'alexia', 'lis', 'uiuc', 'edu', 'Mike', 'Cobb', 'Subject', 'Science', 'and', 'theories', 'Organization', 'University', 'of', 'Illinois', 'at', 'Urbana', 'Lines', '19', 'As', 'per', 'various', 'threads', 'on', 'science', 'and', 'creationism', 'I', 've', 'started', 'dabbling', 'into', 'a', 'book', 'called', 'Christianity', 'and', 'the', 'Nature', 'of', 'Science', 'by', 'JP', 'Moreland', 'A', 'question', 'that', 'I', 'had', 'come', 'from', 'one', 'of', 'his', 'comments', 'He', 'stated', 'that', 'God', 'is', 'not', 'necessarily', 'a', 'religious', 'term', 'but', 'could', 'be', 'used', 'as', 'other', 'scientific', 'terms', 'that', 'give', 'explanation', 'for', 'events', 'or', 'theories', 'without', 'being', 'a', 'proven', 'scientific', 'fact', 'I', 'think', 'I', 'got', 'his', 'point', 'I', 'can', 'quote', 'the', 'section', 'if', 'I', 'm', 'being', 'vague', 'The', 'examples', 'he', 'gave', 'were', 'quarks', 'and', 'continental', 'plates', 'Are', 'there', 'explanations', 'of', 'science', 'or', 'parts', 'of', 'theories', 'that', 'are', 'not', 'measurable', 'in', 'and', 'of', 'themselves', 'or', 'can', 'everything', 'be', 'quantified', 'measured', 'tested', 'etc', 'MAC', 'Michael', 'A', 'Cobb', 'and', 'I', 'won', 't', 'raise', 'taxes', 'on', 'the', 'middle', 'University', 'of', 'Illinois', 'class', 'to', 'pay', 'for', 'my', 'programs', 'Champaign', 'Urbana', 'Bill', 'Clinton', '3rd', 'Debate', 'cobb', 'alexia', 'lis', 'uiuc', 'edu', 'Nobody', 'can', 'explain', 'everything', 'to', 'anybody', 'G', 'K', 'Chesterton', '']


1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
The module `llvmlite.llvmpy` is deprecated and will be removed in the future.
The module `llvmlite.llvmpy.core` is deprecated and will be removed in the future. Equivalent functionality is provided by `llvmlite.ir`.
dpctl could not find any non-host SYCL device on the system. A non-host SYCL device is required to use numba_dpex.
Numba extension module 'numba_dpex.numpy_usm_shared' failed to load due to 'ImportError(No non-host SYCL device found to execute kernels.)'.
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 37ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 31ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 37ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 53ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 105ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 58ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 39ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 36ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 34ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 31ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 30ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 102ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 50ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 34ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 36ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 33ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 47ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 112ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 195ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 147ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 131ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 125ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 130ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 137ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 142ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 132ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 133ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 184ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 135ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 95ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 42ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 104ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 42ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 33ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 32ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 99ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 128ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 56ms/step
Partition explainer:  50%|███████████████████████████████████████▌                                       | 1/2 [00:00<?, ?it/s]
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 92ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 144ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 105ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 189ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 135ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 131ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 134ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 44ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 59ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 44ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 39ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 143ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 123ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 128ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 120ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 46ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 44ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 41ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 30ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 34ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 30ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 176ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 53ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 106ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 179ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 93ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 91ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 134ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 133ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 89ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 133ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 132ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 134ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 136ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 189ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 89ms/step
1/1 [==============================] - ETA: 0s

1/1 [==============================] - 0s 63ms/step
Partition explainer: 3it [00:40,  9.24s/it]                                                                                    
Partition explainer: 3it [00:40, 20.38s/it]

Text Plot

shap.text_plot(shap_values)

Bar Plots

Bar Plot 1

shap.plots.bar(shap_values[:,:, selected_categories[preds[0]]].mean(axis=0), max_display=15,
               order=shap.Explanation.argsort.flip)
Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
../../_images/c438a86ad8c3b77e13d807efce60919d4e96e133d89602946c36628e577e4016.png

Bar Plot 2

shap.plots.bar(shap_values[0,:, selected_categories[preds[0]]], max_display=15,
               order=shap.Explanation.argsort.flip)
../../_images/fa28383ce40c92033883fd115939c2ac00c518c348d9a15b1964bc8cffd78351.png

Bar Plot 3

shap.plots.bar(shap_values[:,:, selected_categories[preds[1]]].mean(axis=0), max_display=15,
               order=shap.Explanation.argsort.flip)
../../_images/d5edadaa96007226069748a705b49834f79cdaa298d32832dc33fae94a7184ba.png

Bar Plot 4

shap.plots.bar(shap_values[1,:, selected_categories[preds[1]]], max_display=15,
               order=shap.Explanation.argsort.flip)
../../_images/d2b5bd5db408fc34fbebb1be1b46e0e9f394e4651f2fd8f03d789b90834b4202.png

Waterfall Plots

Waterfall Plot 1

shap.waterfall_plot(shap_values[0][:, selected_categories[preds[0]]], max_display=15)
../../_images/37f8c87846d33858d987005ed54183f63233870f94c2ca17ac2494a3f3aec21d.png

Waterfall Plot 2

shap.waterfall_plot(shap_values[1][:, selected_categories[preds[1]]], max_display=15)
../../_images/781d2788efce2d63bbf48850351cd191bab864ef1bf905f4d435789fc233f053.png

Force Plot

import re
tokens = re.split("\W+", X_batch_text[0].lower())
shap.initjs()
shap.force_plot(shap_values.base_values[0][preds[0]], shap_values[0][:, preds[0]].values,
                feature_names = tokens[:-1], out_names=selected_categories[preds[0]])
Visualization omitted, Javascript library not loaded!
Have you run `initjs()` in this notebook? If this notebook was from another user you must also trust this notebook (File -> Trust notebook). If you are viewing this notebook on github the Javascript has been stripped for security. If you are using JupyterLab this error is because a JupyterLab extension has not yet been written.